// 参数1：handler表示事件的处理函数
// 参数2：time表示间隔时间
export function shake(handler: Function, time: number) {
    // // 定义定时器变量
    let timer: number = 0
    return function (this: any, ...arg: Array<any>) {
        let _this = this
        // 停止定时器
        clearTimeout(timer)
        // 设置定时器
        timer = setTimeout(() => {
            handler.call(_this, ...arg)
        }, time)
    }
}
interface typeThis {
    [key: string]: any
}
export function throttle(handler: Function, time: number,) {
    // 定义初始时间
    let start = +new Date()
    // 返回的是真正的事件函数
    return function (this: any, ...arg: Array<any>) {
        let _this = this
        // 获取当前时间
        let end = +new Date()
        // 判断时间差
        if (end - start < time) {
            return
        }
        // 事件函数中要执行的代码
        handler.call(_this, ...arg)
        // 将这次的结束时间作为下次的开始时间
        start = end
    }
}

/*
闭包的形成：
    有大函数嵌套小函数，小函数使用大函数中的变量，大函数外跟小函数保持引用关系
闭包的特点：
    1.变量私有化(放在局部不受全局污染了)
    2.延长了变量的生命周期
    3.间接的让全局可以访问局部变量了
闭包的弊端：
    每调用一次大函数，就会在内存中形成一个不销毁的执行空间，滥用闭包容易造成内泄漏
闭包的使用场景：
    1.封装防抖和节流
    2.在循环中绑定事件或循环中执行异步代码的时候
    3.函数柯里化
*/